/**
 * 时间格式化工具类
 * @description 提供智能的时间显示格式化功能
 */

/**
 * 解析时间为 Date 对象
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {Date|null} Date 对象，解析失败返回 null
 */
export function parseTime(time) {
  if (!time) {
    return null
  }

  let date = null

  // 字符串格式
  if (typeof time === 'string') {
    // 替换横杠为斜杠，兼容 iOS
    const timeStr = time.replace(/-/g, '/').trim()
    date = new Date(timeStr)
  } 
  // 数字时间戳
  else if (typeof time === 'number') {
    let timestamp = time
    
    // 秒级时间戳转毫秒
    if (timestamp > 0 && timestamp < 10000000000) {
      timestamp = timestamp * 1000
    }
    
    date = new Date(timestamp)
  }

  // 验证日期有效性
  if (date && !isNaN(date.getTime())) {
    return date
  }

  return null
}

/**
 * 智能格式化时间显示
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {String} 格式化后的时间字符串
 * @description 
 *   - 当天显示：时:分（如：01:50）
 *   - 跨天显示：月-日 时:分（如：11-05 01:50）
 *   - 跨年显示：年-月-日 时:分（如：2024-11-05 01:50）
 */
export function formatSmartTime(time) {
  const date = parseTime(time)
  
  if (!date) {
    return ''
  }

  const now = new Date()
  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
  const targetDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())
  
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  
  const currentYear = now.getFullYear()
  
  // 当天：只显示 时:分
  if (targetDate.getTime() === today.getTime()) {
    return `${hours}:${minutes}`
  }
  
  // 跨年：显示 年-月-日 时:分
  if (year !== currentYear) {
    return `${year}-${month}-${day} ${hours}:${minutes}`
  }
  
  // 跨天（同年）：显示 月-日 时:分
  return `${month}-${day} ${hours}:${minutes}`
}

/**
 * 格式化为完整日期时间
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {String} 格式化后的完整时间字符串（年-月-日 时:分:秒）
 */
export function formatFullTime(time) {
  const date = parseTime(time)
  
  if (!date) {
    return ''
  }

  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  const seconds = String(date.getSeconds()).padStart(2, '0')
  
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

/**
 * 格式化为日期
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {String} 格式化后的日期字符串（年-月-日）
 */
export function formatDate(time) {
  const date = parseTime(time)
  
  if (!date) {
    return ''
  }

  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  
  return `${year}-${month}-${day}`
}

/**
 * 格式化为时间
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {String} 格式化后的时间字符串（时:分）
 */
export function formatTime(time) {
  const date = parseTime(time)
  
  if (!date) {
    return ''
  }

  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  
  return `${hours}:${minutes}`
}

/**
 * 获取相对时间描述
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {String} 相对时间描述（如：刚刚、5分钟前、1小时前、昨天、3天前）
 */
export function formatRelativeTime(time) {
  const date = parseTime(time)
  
  if (!date) {
    return ''
  }

  const now = Date.now()
  const timestamp = date.getTime()
  const diff = now - timestamp
  
  // 未来时间
  if (diff < 0) {
    return formatSmartTime(time)
  }
  
  const seconds = Math.floor(diff / 1000)
  const minutes = Math.floor(seconds / 60)
  const hours = Math.floor(minutes / 60)
  const days = Math.floor(hours / 24)
  
  if (seconds < 60) {
    return '刚刚'
  }
  
  if (minutes < 60) {
    return `${minutes}分钟前`
  }
  
  if (hours < 24) {
    return `${hours}小时前`
  }
  
  if (days === 1) {
    return '昨天'
  }
  
  if (days < 7) {
    return `${days}天前`
  }
  
  // 超过7天，使用智能格式
  return formatSmartTime(time)
}

/**
 * 判断是否为今天
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {Boolean} 是否为今天
 */
export function isToday(time) {
  const date = parseTime(time)
  
  if (!date) {
    return false
  }

  const now = new Date()
  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
  const targetDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())
  
  return targetDate.getTime() === today.getTime()
}

/**
 * 判断是否为今年
 * @param {String|Number} time - 时间字符串或时间戳
 * @returns {Boolean} 是否为今年
 */
export function isThisYear(time) {
  const date = parseTime(time)
  
  if (!date) {
    return false
  }

  const now = new Date()
  return date.getFullYear() === now.getFullYear()
}

export default {
  parseTime,
  formatSmartTime,
  formatFullTime,
  formatDate,
  formatTime,
  formatRelativeTime,
  isToday,
  isThisYear
}

